#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 28 12:54:50 2019

@author: xubing
"""

import matplotlib.pyplot as plt
plt.rcParams['font.family']='Heiti'
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')

class plotFigure(object):
    def __init__(self):
        self.name = 'Plot Figure'
        self.plt_size = [16,9]

    ## 1.目标变量的饼状图
    def plot_target_var(self,df, target):
        '''
        df:数据集
        target:目标变量列
        '''
        labels = list(df[target].value_counts().index)    
        sizes =  list(df[target].value_counts().values)
        explode = (0.05,)*len(labels)
        plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=True,startangle=150)
        plt.title('目标变量分布情况')
        return plt.show()
        
    ## 2.类别型变量的分布
    def plot_cate_var(self,df,col_list,hspace=0.4,wspace=0.4,plt_size=None,plt_num=None,x=4,y=None):
        """
        df:数据集
        col_list:变量list集合
        hspace :子图之间的间隔(y轴方向)
        wspace :子图之间的间隔(x轴方向)
        plt_size :图纸的尺寸
        plt_num :子图的数量
        x :子图矩阵中一行子图的数量
        y :子图矩阵中一列子图的数量
        
        return :变量的分布图（柱状图形式）
        """
        
        plt_num = 8
        x = 2
        y = 4
        
        plt.figure(figsize=self.plt_size)
        plt.subplots_adjust(hspace=hspace,wspace=wspace)

        for i,col in zip(range(1,plt_num+1),col_list):
            plt.subplot(x,y,i)
            plt.title(col)
            sns.countplot(data=df,y=col,orient='v')
            plt.ylabel('')
        return plt.show()
    
    ## 3.数值型变量的分布
    def plot_num_col(self,df,col_list,hspace=0.4,wspace=0.4,plt_type='box',plt_size=None,plt_num=None,x=None,y=None):
        """
        df:数据集
        col_list:变量list集合
        hspace :子图之间的间隔(y轴方向)
        wspace :子图之间的间隔(x轴方向)
        plt_type: 选择直方图/箱线图
        plt_size :图纸的尺寸
        plt_num :子图的数量
        x :子图矩阵中一行子图的数量
        y :子图矩阵中一列子图的数量
        
        return :变量的分布图（箱线图/直方图）
        """
        plt_type = 'hist'
        plt_num = 8
        x = 2
        y = 4
        if plt_size != None:
            plt.figure(figsize = plt_size)
        else:    
            plt.figure(figsize = self.plt_size)
        plt.subplots_adjust(hspace=hspace,wspace=wspace)
        if plt_type=='hist':
            for i,col in zip(range(1, plt_num+1),col_list):
                plt.subplot(x,y,i)
                plt.title(col)
                sns.distplot(df[col].dropna())
                plt.xlabel('')
        elif plt_type=='box':
            for i,col in zip(range(1, plt_num+1),col_list):
                plt.subplot(x,y,i)
                plt.title(col)
                sns.boxplot(data=df,x=col)
                plt.xlabel('')
        return plt.show()
    ## 4.双变量线性相关分析
    def plot_linear_corr(self,df):
        sns.heatmap(df.corr(),cmap='YlGnBu')
        plt.title('相关性矩阵')
        return plt.show()
        